package org.wupuser.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Jedis工具类，用于简化Redis操作 提供了Redis连接池的创建和管理，以及常用的Redis操作方法
 */
public class JedisUtils {
	// 静态变量，用于存储Redis连接池实例
	private static JedisPool jedisPool;
	
	/**
	 * 静态初始化块，用于初始化Redis连接池
	 * 在类加载时执行，只执行一次
	 */
	static {
		// 初始化连接池配置
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxTotal(8); // 最大连接数：设置连接池中最大连接数为8
		config.setMaxIdle(8); // 最大空闲连接数：设置连接池中最大空闲连接数为8
		config.setMinIdle(0); // 最小空闲连接数：设置连接池中最小空闲连接数为0
		config.setMaxWaitMillis(1000); // 获取连接时的最大等待时间：设置获取连接时最大等待时间为1000毫秒
		
		// 创建连接池：使用配置创建JedisPool实例，连接本地Redis服务器，端口为6379
		jedisPool = new JedisPool(
			config,
			"localhost",
			6379);
	}
	
	// 获取Jedis实例
	public static Jedis getJedis() {
		return jedisPool.getResource();
	}
	
	// 释放Jedis资源
	public static void closeJedis(Jedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}
	
	// 设置键值对
	public static void set(
		String key,
		String value) {
		try (Jedis jedis = getJedis()) {
			jedis.set(
				key,
				value);
		}
	}
	
	// 设置带过期时间的键值对
	public static void setex(
		String key,
		int seconds,
		String value) {
		try (Jedis jedis = getJedis()) {
			jedis.setex(
				key,
				seconds,
				value);
		}
	}
	
	// 获取值
	public static String get(String key) {
		try (Jedis jedis = getJedis()) {
			return jedis.get(key);
		}
	}
	
	// 删除键
	public static void del(String key) {
		try (Jedis jedis = getJedis()) {
			jedis.del(key);
		}
	}
	
	// 判断键是否存在
	public static boolean exists(String key) {
		try (Jedis jedis = getJedis()) {
			return jedis.exists(key);
		}
	}
	
	// 设置过期时间
	public static void expire(
		String key,
		int seconds) {
		try (Jedis jedis = getJedis()) {
			jedis.expire(
				key,
				seconds);
		}
	}
	
	// 获取剩余过期时间
	public static long ttl(String key) {
		try (Jedis jedis = getJedis()) {
			return jedis.ttl(key);
		}
	}
}
